/* Sliark 拼音
 *
 * https://zhuanlan.zhihu.com/p/482113176
 *
 * @author Sliark
 */

if (!音韻地位)
  return [
    ["$legacy", true],
    ['字母ŋ', true],
    ['字母ü', true],
    ['字母ö', false],
    ['痕韵的主元音：', [1, 'ə', 'ë', 'eo']],
    ['字母æ', false],
    ['字母å', false],
    ['之韵的元音和BC类开口介音:', [1, 'ı', 'ɨ', 'v', 'ii']],
    ['二等使用下加点', false],
    ['影母标记：', [2, '无标记', 'q', 'ʔ', 'ʾ']],
    [
      '云母开口写法：',
      [1, '视同匣母', '无标记（除礥小韵外,仅影母有标记时有效）'],
    ],
    ['大写类型：', [1, '不大写', '首字母大写', '全部大写']],
  ];

for (var key in 選項) {
  選項[key.replace(':', '')] = 選項[key];
  選項[key.replace('：', '')] = 選項[key];
  // 去除冒號，方便下面代碼中引用
}

const is = (x) => 音韻地位.屬於(x);

function get聲母() {
  if (音韻地位.描述 === '知開三麻平' || (音韻地位.描述 === '知開二庚上' && 字頭 === '打')) return 't'; // 爹打
  return {
    幫: 'p',  滂: 'ph',  並: 'b',  明: 'm',
    端: 't',  透: 'th',  定: 'd',  泥: 'n',  來: 'l',
    知: 'tr', 徹: 'thr', 澄: 'dr', 孃: 'nr',
    見: 'k',  溪: 'kh',  羣: 'g',  疑: (選項.字母ŋ ? 'ŋ' : 'ng'), 云: '',
    影: 'q',  曉: 'h',   匣: 'x',
    精: 'ts',  清: 'tsh',  從: 'dz',  心: 's',  邪: 'z',
    莊: 'tsr', 初: 'tshr', 崇: 'dzr', 生: 'sr', 俟: 'zr',
    章: 't',  昌: 'th',  常: 'd',  書: 's', 船: 'z', 日: 'n', 以: '',
  }[音韻地位.母];
}

function get韻母() {
  const 表達式到韻 = [
    // 爲了方便推導，根據拼寫對韻類稍作調整
    ['臻韻', '眞'],
    ['蒸韻 幫組 或 蒸韻 合口 或 蒸韻 溪母 平聲', '冰'], // 硱（溪開三蒸平）歸 B 類
    ['東韻 三等', '終'],
    ['清韻', '庚'],
    ['陽韻', '唐'],
  ];
  const 韻到韻尾 = [
    ['脂之尤侯 　佳　模　 支魚虞 麻歌', ''],
    ['冰蒸終東 青耕登冬江 　　鍾 庚唐', (選項.字母ŋ ? 'ŋ' : 'ng'), 'k'],
    ['　微微　 齊皆咍灰　 祭廢廢 夬泰', 'j'],
    ['眞欣文　 先山痕魂　 仙元元 刪寒', 'n', 't'],
    ['　　幽　 蕭　　　　 宵　　 肴豪', 'w'],
    ['侵　　　 添咸　覃　 鹽嚴凡 銜談', 'm', 'p'],
  ];
  const 元音列表 = [
    'i',				'ı', 'u', 'u',
    'e', 'ee', 'ə', 'o', 'o',
    'e',			 'ə', 'o',
          'ae', 'a',
  ];

  let 韻 = 音韻地位.韻;
  表達式到韻.some((pair) => {
    if (is(pair[0])) return (韻 = pair[1]);
  });

  let 元音;
  let 韻尾;
  韻到韻尾.some((item) => {
    if (item[0].includes(韻)) {
      元音 =
        元音列表[
          item[0].replace(/ /g, '')[is('開口') ? 'indexOf' : 'lastIndexOf'](韻)
        ];
      韻尾 = item[1 + is('入聲')];
      return true;
    }
  });

  // 添加三等介音
  let 介音;
  if (is('三等')) {
    if (is('幫組')) {
      if ('𩦠'.includes(字頭)) {
        介音 = 'i';
      } else if (is('重紐A類 或 清韻')) {
        if ('碧'.includes(字頭)) {
          介音 = 'ı';
        } else {
          介音 = 'i';
        }
      } else if (is('重紐B類 或 庚韻 或 幽韻 或 蒸韻')) {
        介音 = 'ı';
      } else {
        介音 = 'u';
      }
    }
    //章組的介音同時作為章組標記
    if (is('章昌常日書船以母')) {
      介音 = is('開口') ? 'j' : 'y';
    }
    //云母的介音同時作為云母標記
    if (is('云母')) {
      if ('礥'.includes(字頭)) {
        介音 = 'xi';
      } else {
        介音 = is('開口') ? 'xı' : 'w';
      }
    }
    //普通銳音
    if (is('精組 或 知組 或 來母 或 端組')) {
      if (is('虞鍾尤東韻')) {
        介音 = 'u';
      } else if (is('之蒸韻')) {
        介音 = 'ı';
      } else {
        介音 = is('開口') ? 'i' : 'ü';
      }
    }
    //莊組永遠視作B類
    if (is('莊組')) {
      介音 = is('開口') ? 'ı' : 'u';
    }
    if (is('見溪羣疑影曉匣母')) {
      if (is('幽韻')) {
        if (音韻地位.描述 === '曉三幽平' && '烋休𠇾'.includes(字頭)) {
          介音 = 'ı';
        } else {
          介音 = 'i';
        }
      } else if (is('重紐A類 或 清韻')) {
        介音 = is('開口') ? 'i' : 'ü';
      } else {
        介音 = is('開口') ? 'ı' : 'u';
      }
    }
  }
  // 非三等介音
  else {
    if (is('幫組')) {
      介音 = '';
    } else if (is('章昌常日書船以母')) {
      介音 = is('開口') ? 'j' : 'y';
    } else if (is('云母')) {
      介音 = is('開口') ? 'x' : 'xo'; //匣云混切归匣
    } else {
      介音 = is('開口') ? '' : 'o';
    }
  }
  let 韻母;
  韻母 = 介音 + 元音 + 韻尾;
  韻母 = 韻母.replace('ii', 'i');
  韻母 = 韻母.replace('ıı', 'ı');
  韻母 = 韻母.replace('uu', 'u');
  if (!is('江韻')) {
    韻母 = 韻母.replace('oo', 'o');
  }
  韻母 = 韻母.replace('uw', 'u');
  return 韻母;
}

function get聲調() {
  return { 上: 'x', 去: 'h' }[音韻地位.聲] || '';
}

let 拼音 = get聲母() + get韻母() + get聲調();

if (選項.二等使用下加点) {
  拼音 = 拼音.replace('ee', 'ẹ');
  拼音 = 拼音.replace('ae', 'ạ');
  拼音 = 拼音.replace('oo', 'ọ');
}
拼音 = 選項.字母ö ? 拼音.replace('oe', 'ö') : 拼音;
if (選項.痕韵的主元音 == 'ë') {
  拼音 = 拼音.replace('ə', 'ë');
}
if (選項.痕韵的主元音 == 'eo') {
  拼音 = 拼音.replace('ıə', 'ıo');
  拼音 = 拼音.replace('iə', 'io');
  拼音 = 拼音.replace('jə', 'jo');
  拼音 = 拼音.replace('ə', 'eo');
}
if (!選項.字母ü) {
  拼音 = 拼音.replace('y', 'jy');
  拼音 = 拼音.replace('ü', 'y');
}
拼音 = 選項.字母ŋ ? 拼音.replace('ng', 'ŋ') : 拼音;
拼音 = 選項.字母å ? 拼音.replace('oa', 'å') : 拼音;
if (選項.字母æ) {
  拼音 = 拼音.replace('ae', 'æ');
  拼音 = 拼音.replace('ạ', 'æ');
}
if (選項.影母标记 === '无标记') {
  拼音 = 拼音.replace('q', '');
} else {
  拼音 = 拼音.replace('q', 選項.影母标记);
  if (選項.云母开口写法 === '无标记（除礥小韵外,仅影母有标记时有效）') {
    拼音 = 拼音.replace('xı', 'ı');
  }
}
if (選項.之韵的元音和BC类开口介音 != 'ı') {
  拼音 = 拼音.replace('ı', 選項.之韵的元音和BC类开口介音);
}

function minu2maju(chr) {
  return {
    'a':'A', 'å':'Å', 'b':'B', 'g':'G', 'd':'D', 'e':'E', 'ə':'∃', 'ë':'Ë',
    'z':'Z', 'h':'H', 'i':'I', 'ı':'Ɨ', 'ɨ':'Ɨ', 'j':'J', 'k':'K', 'l':'L',
    'm':'M', 'n':'N', 'ŋ':'Ŋ', 'o':'O', 'ö':'Ö', 'p':'P', 'q':'Q', 'r':'R',
    's':'S', 't':'T', 'u':'U', 'ü':'Ü', 'v':'V', 'w':'W', 'y':'Y', 'x':'X', 'æ':'Æ',
  }[chr] || chr;
}

if (選項.大写类型 === '首字母大写') {
  拼音 = minu2maju(拼音[0]) + 拼音.slice(1);
}

if (選項.大写类型 === '全部大写') {
  拼音 = 拼音.split('').map(minu2maju).join('');
}

return 拼音;
